; ** por compatibilidad se omiten tildes **
; ==============================================================================
; TRABAJO PRACTICO 3 - System Programming - ORGANIZACION DE COMPUTADOR II - FCEN
; ==============================================================================

%include "imprimir.mac"

extern IDT_DESC
extern GDT_DESC
extern idt_inicializar
extern pantalla_inicial
extern mmu_inicializar_dir_kernel
extern dame_pagina_libre
extern mmu_inicializar
extern mmu_inicializar_dir_zombi
extern deshabilitar_pic
extern resetear_pic
extern habilitar_pic
extern init_jugadores
extern tss_inicializar
extern tss_inicializar_idle

global start



;; Saltear seccion de datos
jmp start

;;
;; Seccion de datos.
;; -------------------------------------------------------------------------- ;;
iniciando_mr_msg db     'Iniciando kernel (Modo Real)...'
iniciando_mr_len equ    $ - iniciando_mr_msg

iniciando_mp_msg db     'Iniciando kernel (Modo Protegido)...'
iniciando_mp_len equ    $ - iniciando_mp_msg

;;
;; Seccion de código.
;; -------------------------------------------------------------------------- ;;

;; Punto de entrada del kernel.
BITS 16
start:
    ; Deshabilitar interrupciones
    cli

    ; Cambiar modo de video a 80 X 50
    mov ax, 0003h
    int 10h ; set mode 03h
    xor bx, bx
    mov ax, 1112h
    int 10h ; load 8x8 font

    ; Imprimir mensaje de bienvenida
    imprimir_texto_mr iniciando_mr_msg, iniciando_mr_len, 0x07, 0, 0
    
    ; Habilitar A20
    call habilitar_A20;
    
    ; Cargar la GDT
    lgdt [GDT_DESC]
    
    ; Setear el bit PE del registro CR0
    xor eax, eax
    mov eax, cr0
    or eax, 1
    mov cr0, eax

    ; Saltar a modo protegido
    jmp 0x40:modo_p                   		         ;{index = 8, ti = 0, rpl = 0}  0100 0000
    BITS 32
    modo_p:
    
    ; Establecer selectores de segmento
    mov ax, 0x50                         	         ;{index = 10, ti = 0, rpl = 0}  01010 0 00
    mov ds, ax
    mov ax, 0x60                              	     ;{index = 12, ti = 0, rpl = 0} 0110 0 00
    mov fs, ax
    mov ax, 0x50
    mov es, ax
    mov gs, ax
    mov ss, ax

    ; Establecer la base de la pila
    mov esp, 0x27000
    
    ; Imprimir mensaje de bienvenida
    imprimir_texto_mp iniciando_mp_msg, iniciando_mp_len, 0x07, 0, 0

    ; Inicializar pantalla
    call pantalla_inicial
    
    ; Inicializar el manejador de memoria
    call mmu_inicializar

    ; Inicializar el directorio de paginas
    call mmu_inicializar_dir_kernel
    
    ; Cargar directorio de paginas
    mov eax, 0x27000
    mov cr3, eax

    ; Habilitar paginacion
    mov eax, cr0
    or eax, 0x80000000
    mov cr0, eax

    ; Inicializar tss
    call tss_inicializar

    ; Inicializar tss de la tarea Idle
    call tss_inicializar_idle

    ; Inicializar el scheduler

    ; Inicializar la IDT
    call idt_inicializar
    
    ; Cargar IDT
    lidt [IDT_DESC]

    ; Configurar controlador de interrupciones
    call deshabilitar_pic
    call resetear_pic
    call habilitar_pic

    ; Pintar jugadores
    call init_jugadores

    ; Cargar tarea inicial
    mov ax, 13
    sal ax, 3
    ltr ax 

    ; Habilitar interrupciones
    sti

    ; Saltar a la primera tarea: Idle
    jmp 0x70:0

    ; Ciclar infinitamente (por si algo sale mal...)
    mov eax, 0xFFFF
    mov ebx, 0xFFFF
    mov ecx, 0xFFFF
    mov edx, 0xFFFF
    jmp $
    jmp $

;; -------------------------------------------------------------------------- ;;

%include "a20.asm"
